/**
 * HTTP错误处理工具
 * 提供智能错误分析和用户友好的错误提示
 */
class HttpErrorHandler {
  constructor() {
    this.errorStats = {
      '404': 0,
      '500': 0,
      'timeout': 0,
      'network': 0
    }
  }

  /**
   * 分析错误类型
   * @param {Error} error 错误对象
   * @returns {Object} 错误分析结果
   */
  analyzeError(error) {
    const message = error.message || ''
    const analysis = {
      type: 'unknown',
      isRecoverable: true,
      shouldRetry: true,
      userMessage: '网络请求失败',
      technicalDetails: message
    }

    // 404错误 - API不存在或路径错误
    if (message.includes('404')) {
      this.errorStats['404']++
      analysis.type = '404'
      analysis.isRecoverable = false
      analysis.shouldRetry = false
      analysis.userMessage = '服务暂不可用，将使用离线数据'
      
      // 如果404频繁出现，说明后端服务未启动
      if (this.errorStats['404'] >= 3) {
        analysis.userMessage = '服务器未启动，已切换到演示模式'
      }
    }
    
    // 500错误 - 服务器内部错误
    else if (message.includes('500')) {
      this.errorStats['500']++
      analysis.type = '500'
      analysis.isRecoverable = false
      analysis.shouldRetry = false
      analysis.userMessage = '服务器出现问题，请稍后重试'
    }
    
    // 网络连接错误
    else if (message.includes('Connection') || message.includes('timeout')) {
      this.errorStats['network']++
      analysis.type = 'network'
      analysis.isRecoverable = true
      analysis.shouldRetry = true
      analysis.userMessage = '网络连接不稳定，请检查网络'
    }
    
    // 超时错误
    else if (message.includes('timeout')) {
      this.errorStats['timeout']++
      analysis.type = 'timeout'
      analysis.isRecoverable = true
      analysis.shouldRetry = true
      analysis.userMessage = '请求超时，正在重试'
    }

    return analysis
  }

  /**
   * 获取用户友好的错误提示
   * @param {Error} error 错误对象
   * @returns {Object} 错误提示信息
   */
  getUserFriendlyMessage(error) {
    const analysis = this.analyzeError(error)
    
    const suggestions = {
      '404': [
        '当前处于演示模式',
        '所有功能正常可用',
        '数据为模拟数据'
      ],
      '500': [
        '服务器正在维护',
        '请稍后重试',
        '或联系技术支持'
      ],
      'network': [
        '检查网络连接',
        '尝试切换网络',
        '或稍后重试'
      ],
      'timeout': [
        '网络较慢',
        '正在重试请求',
        '请耐心等待'
      ]
    }

    return {
      title: this.getErrorTitle(analysis.type),
      message: analysis.userMessage,
      suggestions: suggestions[analysis.type] || ['请重试或联系客服'],
      showRetry: analysis.shouldRetry,
      severity: this.getErrorSeverity(analysis.type)
    }
  }

  /**
   * 获取错误标题
   */
  getErrorTitle(errorType) {
    const titles = {
      '404': '演示模式',
      '500': '服务异常',
      'network': '网络问题',
      'timeout': '连接超时',
      'unknown': '网络错误'
    }
    return titles[errorType] || '网络错误'
  }

  /**
   * 获取错误严重程度
   */
  getErrorSeverity(errorType) {
    const severities = {
      '404': 'info',     // 404通常是正常的（演示模式）
      '500': 'error',    // 服务器错误比较严重
      'network': 'warning', // 网络问题用户可以解决
      'timeout': 'warning', // 超时通常可以重试
      'unknown': 'error'
    }
    return severities[errorType] || 'error'
  }

  /**
   * 显示错误提示（适配小程序）
   * @param {Error} error 错误对象
   * @param {Object} options 显示选项
   */
  showErrorToast(error, options = {}) {
    const friendlyMessage = this.getUserFriendlyMessage(error)
    const defaultOptions = {
      showModal: false, // 是否显示模态框
      duration: 3000
    }
    
    const config = { ...defaultOptions, ...options }

    if (config.showModal) {
      wx.showModal({
        title: friendlyMessage.title,
        content: friendlyMessage.message + '\n\n' + friendlyMessage.suggestions.join('\n'),
        showCancel: friendlyMessage.showRetry,
        cancelText: '取消',
        confirmText: friendlyMessage.showRetry ? '重试' : '知道了',
        success: (res) => {
          if (res.confirm && friendlyMessage.showRetry && config.onRetry) {
            config.onRetry()
          }
        }
      })
    } else {
      // 根据严重程度选择图标
      const icon = friendlyMessage.severity === 'info' ? 'success' : 'none'
      
      wx.showToast({
        title: friendlyMessage.message,
        icon: icon,
        duration: config.duration
      })
    }
  }

  /**
   * 获取错误统计信息
   */
  getErrorStats() {
    return {
      ...this.errorStats,
      total: Object.values(this.errorStats).reduce((sum, count) => sum + count, 0)
    }
  }

  /**
   * 重置错误统计
   */
  resetStats() {
    Object.keys(this.errorStats).forEach(key => {
      this.errorStats[key] = 0
    })
  }

  /**
   * 判断是否应该使用降级模式
   */
  shouldUseFallbackMode() {
    // 如果404错误超过3次，建议使用降级模式
    if (this.errorStats['404'] >= 3) {
      return {
        shouldUse: true,
        reason: '后端服务不可用',
        message: '已切换到演示模式，所有功能正常可用'
      }
    }
    
    // 如果总错误数过多，也建议降级
    const totalErrors = this.getErrorStats().total
    if (totalErrors >= 10) {
      return {
        shouldUse: true,
        reason: '网络环境不稳定',
        message: '为保证使用体验，已切换到离线模式'
      }
    }

    return {
      shouldUse: false,
      reason: null,
      message: null
    }
  }
}

// 创建全局实例
const httpErrorHandler = new HttpErrorHandler()

module.exports = {
  HttpErrorHandler,
  httpErrorHandler
} 